package com.wdc.sort;

import java.util.Arrays;
import java.util.Comparator;
import java.util.function.ToIntFunction;

public class E02Leetcode1636 {

    public static void main(String[] args) {
        int[] arr = {1,1,1,2,2,3};
        System.out.println(Arrays.toString(frequencySort(arr)));

    }
    public static int[] frequencySort(int[] nums) {
        //1.新建一个 count 数组 用来计数
        int[] count = new int[201];
        //2.把 nums 中的元素按照值为索引存储起来
        for (int i : nums) {
           count[i + 100]++;
        }
        System.out.println(Arrays.toString(count));
        //3.新建一个 result 数组 用于返回按出现频率升序排列

        return Arrays.stream(nums).boxed().sorted((a, b) -> {
            int af = count[a + 100] ;
            int bf =  count[b + 100];
            if (af < bf){
                return -1;
            } else if (af > bf) {
                return 1;
            }else {
                return b -a;
            }
        }).mapToInt(Integer::intValue).toArray();

    }


    public int[] frequencySort1(int[] nums) {
        // 根据范围，把所有值都➕100，转换到正数区间
        int[] cnt = new int[210];
        for (int n : nums) {
            cnt[n + 100]++;
        }
        for (int i = 0; i < nums.length; i++) {
            // 10000 ✖️ 权重 ➕ 取反后的结果
            nums[i] = 10000 * cnt[nums[i] + 100] + (100 - nums[i]);
        }
        // 排序
        Arrays.sort(nums);
        for (int i = 0; i < nums.length; i++) {
            // 取模后再次取反即可还原
            nums[i] = 100 - nums[i] % 10000;
        }
        return nums;
    }


}
